/*******************************************************************
 *
 *  ttengine.h                                                   1.1
 *
 *    Engine instance structure definition.
 *
 *  Copyright 1996-1999 by
 *  David Turner, Robert Wilhelm, and Werner Lemberg.
 *
 *  This file is part of the FreeType project, and may only be used
 *  modified and distributed under the terms of the FreeType project
 *  license, LICENSE.TXT.  By continuing to use, modify, or distribute
 *  this file you indicate that you have read the license and
 *  understand and accept it fully.
 *
 *  New in 1.1 :
 *
 *    - added the 'raster_lock' mutex field to synchronize
 *      scan-line conversion in thread-safe and re-entrant builds.
 *
 ******************************************************************/

#ifndef TTENGINE_H
#define TTENGINE_H

#include "tttypes.h"
#include "ttconfig.h"
#include "freetype.h"
#include "ttmutex.h"

#ifdef __cplusplus
extern "C" {
#endif

  /********************************************************************/
	/*                                                                  */
	/*  The freetype engine instance structure.                         */
	/*                                                                  */
	/*  This structure holds all the data that is necessary to run      */
	/*  one instance of the freetype engine.  It is needed to get a     */
	/*  completely re-entrant version of the library.                   */
	/*                                                                  */
	/*  The goal is to move _all_ component-specific variables, either  */
	/*  static or global in the structure; the component initializers   */
	/*  and finalizers will all be called with the address of a valid   */
	/*  TEngine_Instance.                                               */
	/*                                                                  */
  /********************************************************************/

	struct TEngine_Instance_ {
		TMutex lock;			/* engine lock */

		void *list_free_elements;

		void *objs_face_class;	/* the face cache class     */
		void *objs_instance_class;	/* the instance cache class */
		void *objs_execution_class;	/* the context cache class  */
		void *objs_glyph_class;	/* the glyph cache class    */

		void *objs_face_cache;	/* these caches are used to track */
		void *objs_exec_cache;	/* the current face and execution */
		/* context objects                */

		void *file_component;	/* ttfile implementation dependent   */

		TMutex raster_lock;		/* mutex for this engine's render pool   */
		void *raster_component;	/* ttraster implementation depedent      */
		Byte raster_palette[5];	/* gray-levels palette for anti-aliasing */

		void *extension_component;	/* extensions dependent */

#if 0
		TT_Glyph_Loader_Callback glCallback;	/* glyph loader callback, if any */
#endif
	};

	/* NOTE : The raster's lock is only acquired by the Render_Glyph and     */
	/*        Render_Gray_Glyph functions, which always release it on exit   */
	/*        They do not lock the engine mutex. This means you shouldn't    */
	/*        be concerned about deadlocks between the two mutexes, as these */
	/*        should never appear..                                          */

	typedef struct TEngine_Instance_ TEngine_Instance;
	typedef TEngine_Instance *PEngine_Instance;

#ifdef TT_CONFIG_OPTION_THREAD_SAFE	/* for re-entrant builds */

#define ENGINE_ARG    TEngine_Instance*  _engine
#define ENGINE_ARGS   TEngine_Instance*  _engine,

#define ENGINE_VAR   _engine
#define ENGINE_VARS  _engine,

#define ENGINE  _engine

#else							/* for thread-safe builds */

#define ENGINE_ARG				/* void */
#define ENGINE_ARGS

#define ENGINE_VAR
#define ENGINE_VARS

#endif							/* TT_CONFIG_OPTION_THREAD_SAFE */

#ifdef __cplusplus
}
#endif
#endif							/* TTENGINE_H */
/* END */
